package com.lingjtx.iot.network.common;

import org.springframework.integration.annotation.Gateway;
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.handler.annotation.Header;

import java.nio.charset.StandardCharsets;

@MessagingGateway(defaultRequestChannel = "mqttPublisherChannel")
public interface MqttPublisherGateway {

    /**
     *等级 | 名称 | 含义说明 | 是否可能丢消息 | 是否可能重复
     * 0 | At most once（最多一次） | 消息最多传输一次，不确认、不重发，可能会丢失。 | ✅ 是 | ❌ 否
     * 1 | At least once（至少一次） | 消息至少传输一次，可能会重复（接收方需幂等处理），客户端需确认（PUBACK）。 | ❌ 否 | ✅ 是
     * 2 | Exactly once（只有一次） | 消息传输一次且仅一次，最安全，最重的开销（四阶段握手：PUB, PUBREC, PUBREL, PUBCOMP）。 | ❌ 否 | ❌ 否
     *
     */
    // QoS 0：适合对丢失不敏感的场景，如温度传感器频繁上报；
    // QoS 1：大多数业务使用的默认，推荐（可靠且性能好）；
    // QoS 2：对可靠性要求极高的场景（比如交易、命令），但性能开销大，慎用
    @Gateway(requestChannel = "mqttPublisherChannel") // 如果指定方法级 @Gateway 会覆盖接口级别注解 @MessagingGateway
    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,
                    @Header(MqttHeaders.QOS) Integer qos,
                    byte[] payload);

    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, byte[] payload);

    default void sendToMqtt(String topic, Integer qos, String payload) {
        this.sendToMqtt(topic, qos, payload.getBytes(StandardCharsets.UTF_8));
    }

    default void sendToMqtt(String topic, String payload) {
        this.sendToMqtt(topic, payload.getBytes(StandardCharsets.UTF_8));
    }


}
